#ifndef TIMER_MANAGER_H
#define TIMER_MANAGER_H
#include <stdint.h>
#include <stdbool.h>
//定时器状态
typedef enum {
    TIMER_NODE_STOPPED = 0,  // 停止状态：未运行
    TIMER_NODE_RUNNING,      // 运行状态：正在计时
} timer_node_state_t;

//定时器模式
typedef enum {
    TIMER_NODE_ONE_SHOT = 0, // 单次触发：定时时间到后执行一次回调，自动停止
    TIMER_NODE_PERIODIC      // 周期性触发：定时时间到后执行回调，重新开始计时
} timer_node_mode_t;

//定时器事件格式
typedef void (*timer_event_t)(void*); 

//隐式结构体，类型是timer_node_t，本体隐藏，定义在c文件
typedef struct timer_node timer_node_t;

/// @brief 定时器初始化
/// @param 无
void timer_manager_init(void);

/// @brief 申请定时器节点，并定死定时模式
/// @param mode 定时模式，单次还是循环触发
/// @param timeout_func 定时事件回调函数指针
/// @param user_data 可以传入给回调函数的数据指针，可以NULL
/// @return 系统分配的定时节点，分配失败返回NULL
timer_node_t *timer_manager_creat(timer_node_mode_t mode, 
									timer_event_t timeout_func,  
									void* user_data);

/// @brief 启动定时器，并设置超时时间；如果像临时修改时间，也可以调用此函数
/// @param tm_node 定时器节点指针
/// @param timeout_ms 超时时间
/// @return 运行是否成功
bool timer_manager_start(timer_node_t *tm_node, uint32_t timeout_ms);

/// @brief 定时器停止运行
/// @param timer 定时器节点指针 
void timer_manager_stop(timer_node_t* tm_node);

/// @brief 删除定时器节点
/// @param timer 定时器节点
void timer_manager_delete(timer_node_t* tm_node);

/// @brief 放置到1ms定时器中断里边，自动扫描定时节点并执行回调函数，回调函数不要阻塞定时器
/// @param  空
void timer_manager_run(void);

#endif
